算法——求禮物的重量集合(美圖在線筆試算法第二題)

題目概述:

小明給小紅準備了n份新年禮物,但小明不會告訴小紅每件禮物的重量,小明將禮物重量和寫成一個子集。讓小紅猜每個禮物的重量。

例如:輸入:整數n 和 一個整數數組sum[2^n-1];整數數組裏麪包含重量值。

n=3;sum[]={12,6,18,5,17,11,23},sum內容爲相加的重量集合(本身不相加);

輸出:5,6,12;

解題思路:

集合中所有值都有可能是禮物重量,但最小的數值肯定是其中之一的禮物重量。

先對數組sum升序排列,然後從第一個數值與後面數值相加,如果所得“和”存在與數組中,則將與和相同的數值賦值爲0,然後再從第二個非零數值開始同樣步驟,最後的到非零數值就是各個禮物的重量。(注意不要本身相加和與零相加)

  

java程序算法:

package equnaer;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;

public class qunaer {

	public static void main(String[] args) {
        /*Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int[] nn=new int[(int) (Math.pow(2,n)-1)];
		if(n==1) {
			System.out.println(nn[0]);
		}else {
			
		}*/
		int[] nn=new int[] {12,6,18,5,17,11,23};
		HashSet<Integer> set=new HashSet<>();
		for(int i=0;i<nn.length;i++) { 
			set.add(nn[i]);
		}
		Arrays.sort(nn);
		for(int x=0;x<nn.length;x++) {
			if(nn[x]!=0) {
			    int temp=nn[x];
				for(int i=x+1;i<nn.length;i++) {
					if(set.contains(temp+nn[i])&&nn[i]!=0) {
					    for(int j=0;j<nn.length;j++) {
					    	if(temp+nn[i]==nn[j])
					    		nn[j]=0;
					    }
					}
				}
			}
			
		}

		for(int i=0;i<nn.length;i++) {
			if(nn[i]!=0) {
				System.out.println(nn[i]);
			}

		}
		
	}	

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章